﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Prisa.Entities;
using Prisa.DataAccess;
using Microsoft.Practices.Unity;

namespace Prisa.BussinesLogic
{
    public class CompraBL:ICompraBL
    {
        [Dependency]
        public ICompraDAO compraDAO { get; set; }

        [Dependency]
        public IVentaDAO ventaDAO { get; set; }
        
        [Dependency]
        public IDetalleCompraDAO detalleComDAO { get; set; }

        [Dependency]
        public IProductoDAO productoDAO { get; set; }

        [Dependency]
        public ICategoriaDAO categoriaDAO{ get; set; }

        public List<COMPRA> GetAllFromCompra()
        {
            return compraDAO.GetAllFromCompra();
        }

        public List<COMPRA> GetFromCompraByProveedor(string descripcion)
        {
            return compraDAO.GetFromCompraByProveedor(descripcion);
        }

        public List<COMPRA> GetFromCompraByNroGuia(string descripcion)
        {
            return compraDAO.GetFromCompraByNroGuia(descripcion);
        }

        public COMPRA GetFromCompraById(int id)
        {
            return compraDAO.GetFromCompraById(id);
        }

        public void AddCompra(COMPRA compra)
        {
            var msg = "";
            var ok = compra.Validate(out msg);

            if (ok)
            {
                compraDAO.AddCompra(compra);

                #region UpdateStock
                foreach (var item in compra.DETALLECOMPRAs)
                {
                    //var producto = productoDAO.GetFromProductoById(item.PRODUCTO.Id);
                    //var categoria = categoriaDAO.GetFromCategoriaById(item.PRODUCTO.CategoriaId);

                    var producto = productoDAO.GetFromProductoById(item.ProductoId);
                    var categoria = categoriaDAO.GetFromCategoriaById(producto.CategoriaId);
                    
                    var actproducto = producto;
                    actproducto.CATEGORIA = categoria;
                    actproducto.Stock = producto.Stock + item.Cantidad;
                    productoDAO.UpdateProducto(actproducto);
                }
                #endregion

            }
            else
            {
                throw new Exception(msg);
            }            
        }

        public void UpdateCompra(COMPRA compra)
        {
            var msg = "";
            var ok = compra.Validate(out msg);

            if (ok)
            {
                #region UpdateStock
                foreach (var item in compra.DETALLECOMPRAs)
                {
                    var existeDetal = detalleComDAO.GetFromProductoByDetalleCompraId(item.ProductoId, compra.Id);

                    if (existeDetal != null)//modificado
                    {
                        if (item.Cantidad != existeDetal.Cantidad)
                        {
                            var producto = productoDAO.GetFromProductoById(item.ProductoId);
                            var categoria = categoriaDAO.GetFromCategoriaById(producto.CategoriaId);
                            var productoAlm = producto;

                            productoAlm.CATEGORIA = categoria;
                            productoAlm.Stock = producto.Stock - existeDetal.Cantidad + item.Cantidad;
                            productoDAO.UpdateProducto(productoAlm);
                        }
                    }
                    else//nuevo
                    {
                        var producto = productoDAO.GetFromProductoById(item.ProductoId);
                        var categoria = categoriaDAO.GetFromCategoriaById(producto.CategoriaId);

                        var actproducto = producto;
                        actproducto.CATEGORIA = categoria;
                        actproducto.Stock = producto.Stock + item.Cantidad;
                        productoDAO.UpdateProducto(actproducto);
                    }
                }
                #endregion   
             
                compraDAO.UpdateCompra(compra);
            }
            else
            {
                throw new Exception(msg);
            } 
        }

        public List<COMPRA> GetFromComprabyFechasAndProveedor(DateTime? fec1, DateTime? fec2, string proveedor)
        {
            return compraDAO.GetFromComprabyFechasAndProveedor(fec1, fec2, proveedor);
        }


        public List<COMPRA> GetFromComprabyFechasAndNroGuia(DateTime? fec1, DateTime? fec2, string nroGuia)
        {
            return compraDAO.GetFromComprabyFechasAndNroGuia(fec1, fec2, nroGuia);
        }
    }
}
